package jdx_14_基于CAS的新锁;

import java.util.concurrent.Semaphore;

public class T11_TestSemaphore {
    public static void main(String[] args) {

        //Semaphore 叫做:信号量  允许一个线程同时执行
        //Semaphore s = new Semaphore(1);
        Semaphore s = new Semaphore(2, true);

        new Thread(()->{
            try {
                s.acquire(); // 阻塞方法： Semaphore 第一个参数是2，每次调用一次 acquire() 就会减1。

                System.out.println("T1 running...");
                Thread.sleep(1000);
                System.out.println("T1 running...");

            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                s.release(); //执行完毕之后 Semaphore 第一个参数将会变回2，那么其他的线程就可以继续 acquire()
            }
        }).start();

        new Thread(()->{
            try {
                s.acquire();

                System.out.println("T2 running...");
                Thread.sleep(1000);
                System.out.println("T2 running...");

                s.release();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}
/*
[应用]
Semaphore(信号量) 限流:限制同时执行的线程数量
    比如：8条车道，但是只有2个收费站。
    比如：100个人，但是只有5个买票窗口。

[作用]
(1).acquire();它是一个许可证，每次调用参数都会减1(用掉一个许可)，如果[参数]变为0了，此时就不允许线程来执行(阻塞等待)
    这里的[参数]指的是:"Semaphore s = new Semaphore(2, true);"第一个参数

(2).s.release();可以重置参数

 */
